﻿using System;
using System.Linq;
using System.Xml.Linq;
using System.IO;

public class XsdSorter
{
    public void SortXsdElements(string inputPath, string outputPath)
    {
        var doc = XDocument.Load(inputPath);
        var schema = doc.Root;

        // 处理所有complexType
        var complexTypes = schema.Elements()
            .Where(e => e.Name.LocalName == "complexType")
            .ToList();

        // ... 前略 ...

        foreach (var ct in complexTypes)
        {
            // 获取所有子节点（包括属性定义）
            var originalNodes = ct.Nodes().ToList();

            // 查找需要排序的容器（all/sequence）
            var container = ct.Elements()
                .FirstOrDefault(e => e.Name.LocalName == "all" || e.Name.LocalName == "sequence");

            if (container != null)
            {
                // 分离注释和元素
                var annotations = container.Elements()
                    .Where(e => e.Name.LocalName == "annotation")
                    .ToList();

                var elements = container.Elements()
                    .Where(e => e.Name.LocalName == "element")
                    .OrderBy(e => e.Attribute("name")?.Value, StringComparer.OrdinalIgnoreCase)
                    .ToList();

                // 重建排序后的容器
                var newContainer = new XElement(container.Name,
                    container.Attributes(),
                    annotations.Concat(elements)
                );

                // 替换原容器并保留其他节点
                var containerIndex = originalNodes.IndexOf(container);
                originalNodes.RemoveAt(containerIndex);
                originalNodes.Insert(containerIndex, newContainer);
            }

            // 替换整个complexType内容
            ct.ReplaceNodes(originalNodes); // 保留所有原始节点
        }

        // ... 后略 ...

        // 保持原始格式
        doc.Save(outputPath);
    }
}

/* 使用示例：
new XsdSorter().SortXsdElements("input.xsd", "sorted.xsd");
*/